package com.qf.service.impl;

/*
 *  @author Administrator
 *  @version V1.0
 *  @Project smartdeviceplatgorm
 *  @Package com.qf.service.impl
 *  @Description
 *  @Date2022/3/21 0021 17:41
 */

import com.qf.bean.SysScene;
import com.qf.bean.SysUserInfo;
import com.qf.cache.SceneCache;
import com.qf.enums.EmptyType;
import com.qf.exception.AddDataException;
import com.qf.exception.QueryDataException;
import com.qf.mapper.SysSceneMapper;
import com.qf.service.SysSceneService;
import com.qf.utils.ResultCode;
import com.qf.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.Date;

@Service
public class SysSceneServiceImpl implements SysSceneService {
    private SysSceneMapper sysSceneMapper;
    private SceneCache sceneCache;
    @Autowired
    public void setSceneCache(SceneCache sceneCache) {
        this.sceneCache = sceneCache;
    }

    @Autowired
    public void setSysSceneMapper(SysSceneMapper sysSceneMapper) {
        this.sysSceneMapper = sysSceneMapper;
    }

    @Override
    public void addSysScene(SysScene sysScene) {
        //检查是不是传数据了
        Assert.isTrue(!sysScene.isEmpty(EmptyType.ADD), () -> {
            throw new AddDataException("请填写场景名!", ResultCode.DATA_NULL);
        });
        //检查当前是不是登录了用户,如何判断用户登录了, 所以一定有个地方保存了登录的用户(数据到底保存在什么地方是我们决定的),我们登录完成后放到session了
        //那我们只需要从session中获取
        SysUserInfo loginUser = SecurityUtils.getLoginUser();
        Assert.notNull(loginUser, () -> {
            throw new AddDataException("未登录", ResultCode.LOGIN_NOT);
        });

        SysScene scene = findBySysSceneNameAndId(sysScene.getSceneName(), loginUser.getUId());
        if(scene==null){
            //设置上别的数据
            sysScene.setCreateBy(loginUser.getUId());
            sysScene.setCreateTime(new Date());
            //没有的直接添加
            sysSceneMapper.addSysScene(sysScene);
        }else {
            //本来就有的更新状态
            sysSceneMapper.updateSysScene(scene.getSceneId(),1);
        }

    }

    @Override
    public SysScene findBySysSceneNameAndId(String SysSceneName, Integer userid) {
        SysScene sysScene = sysSceneMapper.findBySysSceneNameAndId(SysSceneName, userid);
        return sysScene;
    }

    @Override
    public SysScene findById(Integer sceneId) {
        SysUserInfo userInfo = SecurityUtils.getLoginUser();
        Assert.notNull(userInfo,()->{
            throw new AddDataException("未登陆", ResultCode.LOGIN_NOT);
        });
        //查询数据的时候需要根据id和当前的用户进行查询
        //方式1 查询数据库的条件就是主键和用户的id

        //方式2  根据主键查询数据, 然后代码中判断用户(这种方法是直接通过索引查询,主键索引是最快的查询,所以用这种,效率比方式1高得多)
        //从缓存中查询
        SysScene sysScene = sceneCache.get(sceneId);
//        Assert.notNull(sysScene.getSceneId(),()->{
//            throw new QueryDataException("数据不存在", ResultCode.DATA_NULL);
//        });
//
//        Assert.isTrue(sysScene.getSceneId()!=null,()->{
//            throw new QueryDataException("数据不存在", ResultCode.DATA_NULL);
//        });
//
//        //判断一下是不是登录用户的数据,不是不能返回
//        Assert.isTrue(sysScene.getCreateBy()==userInfo.getUId(),()->{
//            throw new QueryDataException("数据不存在", ResultCode.DATA_NULL);
//        });

        //合并一下
        Assert.isTrue(sysScene.getSceneId()!=null&&sysScene.getCreateBy()==userInfo.getUId(),()->{
            throw new QueryDataException("数据不存在", ResultCode.DATA_NULL);
        });
        return sysScene;
    }


}
